#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
#include "Wed_framework_config.h"

/******************************************************************************/
/* \brief 硬件描述相关定义 *******************************************************/
/******************************************************************************/
/**
 * \brief 系统时钟频率，这里是机器定时器的时钟频率
 */
#define configCPU_CLOCK_HZ                  ((unsigned long ) 24000000)
/**
 * \brief 机器定时器基地址
 */
#define configMTIME_BASE_ADDRESS              0xE6000000
/**
 * \brief 机器定时比较器器基地址
 */
#define configMTIMECMP_BASE_ADDRESS           0xE6000008

/******************************************************************************/
/* \brief 调度行为相关定义 *******************************************************/
/******************************************************************************/
/**
 * \brief configTICK_RATE_HZ 用于设置系统节拍中断的频率（单位：Hz），
 *        通常根据 configCPU_CLOCK_HZ 的值计算得出。
 */
#define configTICK_RATE_HZ                    1000
/**
 * \brief 将 configUSE_PREEMPTION 设为 1 启用抢占式调度，设为 0 则启用协作式调度。
 */
#define configUSE_PREEMPTION                  1
/**
 * \brief configMINIMAL_STACK_SIZE 用于定义空闲任务（Idle task）
 *        使用的栈大小（以字为单位，而非字节）。内核不会将此常量用于其他用途。
 */
#define configMINIMAL_STACK_SIZE              512
/**
 * \brief configMAX_PRIORITIES 用于设置可用的任务优先级数量。
 *        任务的优先级可设置为 0 到（configMAX_PRIORITIES - 1），其中 0 为最低优先级。
 */
#define configMAX_PRIORITIES                  8
/**
 * \brief 该数值表示自 RTO S内核启动以来，定时器中断已执行的次数。
 *        tick 计数存储在 TickType_t 类型的变量中。
 *
 *        configTICK_TYPE_WIDTH_IN_BITS 用于控制 TickType_t 的类型（及其位宽）：
 *        当将 configTICK_TYPE_WIDTH_IN_BITS 定义为 TICK_TYPE_WIDTH_16_BITS 时，
 *        TickType_t 将被 typedef 定义为 16 位无符号整型。
 *
 *        当将 configTICK_TYPE_WIDTH_IN_BITS 定义为 TICK_TYPE_WIDTH_32_BITS 时，
 *        TickType_t 将被 typedef 定义为 32 位无符号整型。
 *
 *        当将 configTICK_TYPE_WIDTH_IN_BITS 定义为 TICK_TYPE_WIDTH_64_BITS 时，
 *        TickType_t 将被 typedef 定义为 64 位无符号整型。
 */
#define configTICK_TYPE_WIDTH_IN_BITS         TICK_TYPE_WIDTH_32_BITS

/******************************************************************************/
/* \brief 软件定时器相关定义 *****************************************************/
/******************************************************************************/
/**
 * \brief 将 configUSE_TIMERS 设置为 1 以在构建中包含软件定时器功能，
 *        设置为 0 则排除该功能。当 configUSE_TIMERS 设为 1 时，
 *        必须将 FreeRTOS/source/timers.c 源文件包含在构建中。
 *        若未定义此配置项，则默认为 0。
 */
#define configUSE_TIMERS                      1
/**
 * \brief configTIMER_TASK_PRIORITY 用于设置定时器任务的优先级。
 *        仅当 configUSE_TIMERS 设置为 1 时生效。定时器任务是标准的 FreeRTOS 任务，
 *        因此其优先级设置方式与其他任务相同。
 *        仅当 configUSE_TIMERS 设置为 1 时此配置项才会生效。
 */
#define configTIMER_TASK_PRIORITY            (configMAX_PRIORITIES - 1)
/**
 * \brief configTIMER_TASK_STACK_DEPTH 用于设置定时器任务的堆栈大小
 *       （以字(word)为单位，而非字节）。定时器任务是标准的 FreeRTOS 任务。
 *        仅当configUSE_TIMERS设置为1时此配置项才会生效。
 */
#define configTIMER_TASK_STACK_DEPTH          configMINIMAL_STACK_SIZE
/**
 * \brief configTIMER_QUEUE_LENGTH 用于设置定时器服务任务命令队列的长度
 *       （即队列可容纳的独立消息项数量）。仅当 configUSE_TIMERS 设置为 1 时此配置项才会生效。
 */
#define configTIMER_QUEUE_LENGTH              4

/******************************************************************************/
/* \brief 内存分配相关定义  ******************************************************/
/******************************************************************************/
/**
 * \brief 将 configSUPPORT_STATIC_ALLOCATION 设为 1 以在构建中包含
 *        使用静态分配内存创建 FreeRTOS 对象（任务、队列等）的 API 函数；
 *        设为 0 则排除从构建中创建静态分配对象的能力。若未定义，默认值为 0。
 */
#define configSUPPORT_STATIC_ALLOCATION       1
/**
 * \brief 将 configSUPPORT_DYNAMIC_ALLOCATION 设置为 1，
 *        以在构建中包含使用动态分配内存创建 FreeRTOS 对象（任务、队列等）的 FreeRTOS API 函数。
 *        设置为 0 则从构建中排除创建动态分配对象的功能。如果未定义，默认值为 1。
 */
#define configSUPPORT_DYNAMIC_ALLOCATION      WED_MEM_DYMANICS

/******************************************************************************/
/* \brief 钩子与回调函数相关定义 **************************************************/
/******************************************************************************/
/**
 * \brief 将以下 configUSE_* 开头的常量设为 1 可在编译时启用对应的钩子功能，
 *        设为 0 则禁用。注意：若启用某项钩子功能（设为 1），应用程序开发者需自行实现对应的钩子函数。
 */
#define configUSE_IDLE_HOOK                   0
#define configUSE_TICK_HOOK                   0
#define configUSE_MALLOC_FAILED_HOOK          0
#define configUSE_DAEMON_TASK_STARTUP_HOOK    0

/******************************************************************************/
/* \brief 运行时与任务状态统计相关定义 *********************************************/
/******************************************************************************/
/**
 * \brief 将 configUSE_TRACE_FACILITY 设为 1 以包含任务结构体中的附加成
 *        员（供追踪和可视化功能及工具使用）；设为 0 则排除这些附加信息。若未定义，默认值为 0。
 */
#define configUSE_TRACE_FACILITY              1

/******************************************************************************/
/* \brief 调试辅助功能 **********************************************************/
/******************************************************************************/
/**
 * \brief configASSERT() 具有与标准 C assert() 相同的语义。
 *        可以定义为断言失败时执行特定操作，也可以完全取消定义（即注释掉或删除定义）以彻底移除断言检查。
 *        configASSERT() 可定义为任何需要的操作，例如：
 *        - 调用一个传递断言失败文件名和行号的函数（示例："vAssertCalled(__FILE__, __LINE__)"）。
 *        - 或直接关闭中断并进入循环，使程序停在断言失败处以便在调试器中查看。
 *        */
#define configASSERT(x)             \
    if ((x) == 0) {                 \
        taskDISABLE_INTERRUPTS();   \
        __asm volatile("ebreak");   \
        for (;;);                   \
    }

/******************************************************************************/
/* \brief 功能模块的包含/排除定义 *************************************************/
/******************************************************************************/
/**
 * \brief 互斥锁功能配置
 */
#define configUSE_MUTEXES                     1
/**
 * \brief 任务延时功能配置
 */
#define INCLUDE_vTaskDelay                    1
#endif
